package com.common.base.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;
import java.util.Collection;
import java.util.Map;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

import com.common.base.model.PaginationSupport;


public interface BaseDao {
    
	/**
	 * 保存实体对象
	 * @param entity 需要保存的实体对象
	 */
	public void save(Object entity);

	/**
	 * 保存暂态修改游离态对象
	 * @param entity 需要保存修改游离态对象
	 */
	public void saveOrUpdate(Object entity);
	
	/**
	 * 保存暂态修改游离态对象的集合
	 * @param list  需要保存修改游离态对象的集合
	 */
	public void saveOrUpdate(List list);
	
	/**
	 * 合并实体
	 * @param obj 需要合并的实体类
	 */
	public void merge(Object obj);
	
	/**
	 * 删除实体类
	 * @param obj 需要删除的实体类
	 */
	public void delete(Object obj);
	
	/**
	 * 删除对象集合
	 * @param list 需要被删除的对象集合
	 */
	public void deleteAll(List list);
	
	/**
	 * 查找实体entityName主键主id的所有对象
	 * @param entityName 实体类
	 * @param id 需要查找的id
	 * @return
	 */
	public Object findById(String entityName,Serializable id);
	
	/**
	 * 使用hql语句查找对象
	 * @param hql
	 * @return
	 */
	public  List findByHql(String hql);
	
	/**
	 * 查找实体entityName的所有对象
	 * @param entityName
	 * @return
	 */
	public List findAll(String entityName);
	
	/**
	 * 通过写作参数文件的hql语句查询
	 * @param namedQuery 参数文件的hql语句名字
	 * @return
	 */
    public List findByNamedQuery(final String namedQuery) ;
    
    /**
     * 通过写作参数文件的hql语句和一个条件查询
     * @param query 参数文件的hql语句名字
     * @param parameter 参数
     * @return
     */
    public List findByNamedQuery(final String query, final Object parameter) ;
    
    /**
     * 通过写作参数文件的hql语句和条件查询
     * @param query 参数文件的hql语句名字
     * @param parameters 参数集合
     * @return
     */
    public List findByNamedQuery(final String query, final Object[] parameters);
    
    /**
     * 分页查询通过参数文件里的hql语句 
     * @param startIndex 开始数字
     * @param pageSize 最多数字
     * @param namedQuery 参数文件的hql语句名字
     * @param parameters 参数集合
     * @return
     */
    public PaginationSupport executeHQLPage(final int startIndex,final int pageSize,final String namedQuery,final Object[] parameters) ;

    /**
     * 查询是否有数据 通过参数里的hql语句
     * @param namedQuery 参数文件的hql语句名字
     * @param parameters 参数集合
     * @return
     */
    public Integer executeHQL(final String namedQuery,final Object[] parameters) ;
    
    /**
     * 查询通过参数文件里的hql语句
     * @param namedQuery 参数文件的hql语句名字
     * @param parameters 参数集合
     * @return
     */
    public List executeHQLList(final String namedQuery,final Object[] parameters) ;
    
    /**
     * 分页查询
     * @param entityName 实体类名字
     * @param firstRow 开始位置
     * @param maxRow 最大数据
     * @return
     */
    public PaginationSupport findAll(String entityName,Integer firstRow,Integer maxRow) ;
	
    /**
     * 查询
     * @param entityName 实体类名字
     * @param orderField 排列的字段
     * @param order 排列的方式
     * @return
     */
	public List findAllOrderBy(String entityName,String orderField,String order);
	
	/**
	 * 分页查询
	 * @param entityName 实体类名字
	 * @param orderField 排列的字段
	 * @param order 排列的方式
	 * @param firstRow
	 * @param maxRow
	 * @return
	 */
	public PaginationSupport findAllOrderBy(String entityName,String orderField,String order,Integer firstRow,Integer maxRow);
	
	/**
	 * 条件查询
	 * @param entityName 实体类名字
	 * @param where 条件
	 * @return
	 */
	public List findByWhere(String entityName,String where);
	
	/**
	 * 分页条件查询
	 * @param entityName 实体类名字
	 * @param where 条件
	 * @param firstRow 开始位置
	 * @param maxRow 最大数据
	 * @return
	 */
	public PaginationSupport findByWhere(String entityName,String where,Integer firstRow,Integer maxRow);
	
	/**
	 * 条件查询
	 * @param entityName 实体类名字
	 * @param where 条件
	 * @param orderField 排列字段
	 * @param order 排列方式
	 * @return
	 */
	public List findByWhereOrderBy(String entityName,String where,String orderField, String order);
	
	/**
	 *  分页查询
	 * @param entityName 实体类名字
	 * @param where 条件
	 * @param orderField 排列字段
	 * @param order 排列方式
	 * @param startIndex 开始位置
	 * @param pageSize 最大数据
	 * @return
	 */
	public PaginationSupport findByWhereOrderBy(String entityName,String where,String orderField, String order,final Integer startIndex,final Integer pageSize);

	/**
	 * 
	 * @return
	 */
	public HibernateTemplate getBaseHibernateTemplate();
	
	/**
	 * 
	 * @return
	 */
	public Session getBaseSession();
	
	/**
	 * 
	 * @param s
	 */
	public void closeSession(Session s);

    
    
}